﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOEvaluacion : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOEvaluacion instance = null; 
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.EvaluacionDataTable EvaluacionTabla = new DataSetConsultora.EvaluacionDataTable();
        private EvaluacionTableAdapter EvaluacionTableAdapter = new EvaluacionTableAdapter();
        // Dependencias de otros DAOs
        private DAOPuesto miDAOPuesto = DAOPuesto.Instance;
        private DAOCuestionario miDAOCuestionario = DAOCuestionario.Instance;

        public static DAOEvaluacion Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOEvaluacion();
                        }
                    }
                }
                return instance;
            }
        }

        public int contar(string cod)
        {
            return Convert.ToInt32(EvaluacionTableAdapter.ContarPorPuesto(cod));
        }

        public Evaluacion guardar(Evaluacion unaEvaluacion, int id_puesto)
        {

            // Inserto la evaluaciopn por medio de su table adapter          
            EvaluacionTableAdapter.insertar(unaEvaluacion._fecha_inicio, unaEvaluacion._fecha_fin, id_puesto, unaEvaluacion._tiempoMaximo);

          
            // Finalmente retorno la evaluacion que inserte
            return recolectarUno();
        }

        public void guardar(Evaluacion unaEvaluacion)
        {

            // Inserto la evaluaciopn por medio de su table adapter          
            EvaluacionTabla = EvaluacionTableAdapter.insertar(unaEvaluacion._fecha_inicio, unaEvaluacion._fecha_fin, unaEvaluacion._puesto._id, unaEvaluacion._tiempoMaximo);

            // Le seteo el id o codigo con el que fue insertada la evaluacion
            unaEvaluacion._cod_evaluacion = recolectarId();          

            // Guardo los cuestionarios de la evaluacion 
            miDAOCuestionario.guardar(unaEvaluacion);
             
        }

        public List<Evaluacion> cargar()
        {

            // Cargo los Evaluacion de la db
            EvaluacionTabla = EvaluacionTableAdapter.GetData();

            // Finalmente devuelvo la lista de EvaluacionsCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<Evaluacion> cargar(Int32 cod_evaluacion)
        {   // obtengo la evaluacion por id en EvaluacionTabla
            EvaluacionTabla = EvaluacionTableAdapter.GetData();

            // Finalmente devuelvo la lista de EvaluacionsCargados, recolectadas por la funcion            
            return recolectar();
        }

        public List<Evaluacion> cargar(string codP, string codEmp)
        {   
            // obtengo las evaluaciones por idPuesto y idEmpresa en EvaluacionTabla
            EvaluacionTabla = EvaluacionTableAdapter.ConsultarPorCodPEmp(codP, codEmp);
            // Finalmente devuelvo la lista de EvaluacionesCargados, recolectadas por la funcion            
            return recolectar();
        }

        private List<Evaluacion> recolectar()
        {

            // Creo la lista para recolectar y devolver los Evaluacions cargados de la db
            List<Evaluacion> EvaluacionsCargados = new List<Evaluacion>();

            // Recorro los Evaluacions de la tabla
            foreach (DataSetConsultora.EvaluacionRow unaEvaluacionFila in EvaluacionTabla)
            {

                // Creo un Evaluacion y lo agrego a la lista de Evaluacions cargados
                /*
                EvaluacionsCargados.Add(new Evaluacion(unaEvaluacionFila.id,
                                                        unaEvaluacionFila.fecha_inicio,
                                                        unaEvaluacionFila.fecha_fin,
                                                        miDAOPuesto.cargarUno(unaEvaluacionFila.id)
                                                        )
                                        );
                */
                EvaluacionsCargados.Add(new Evaluacion(unaEvaluacionFila.id,
                                                        unaEvaluacionFila.fecha_inicio,
                                                        unaEvaluacionFila.fecha_fin,
                                                        unaEvaluacionFila.tiempo_max,
                                                        new Puesto()
                                                        )
                                        );

            }

            return EvaluacionsCargados;
        }


        private Evaluacion recolectarUno()
        {
            return new Evaluacion(EvaluacionTabla[0].id,
                                    EvaluacionTabla[0].fecha_inicio,
                                    EvaluacionTabla[0].fecha_fin,
                                    EvaluacionTabla[0].tiempo_max,
                                    miDAOPuesto.cargarUno(EvaluacionTabla[0].id)
                                    );
        }

        private Evaluacion recolectarUnoLazy()
        {
            return new Evaluacion(EvaluacionTabla[0].id,
                                    EvaluacionTabla[0].fecha_inicio,
                                    EvaluacionTabla[0].fecha_fin,
                                    EvaluacionTabla[0].tiempo_max);
        }

        private int recolectarId()
        {
            if (EvaluacionTabla.Count > 0){
                return EvaluacionTabla[0].id;
            }

            return -1;
        }
        

        public Evaluacion cargarUno(Cuestionario cuest)
        {

            EvaluacionTabla = EvaluacionTableAdapter.ConsultarPorCuestionario(cuest._cod_cuestionario);

            return recolectarUnoLazy();
        }

    }

}